# pandas 主要处理类是关系型数据库的表，或者excel这样的表格数据的库，能够异构数据
# pandas主要包括两个对象：
    # Series 一维数组，他的数据是同构的。来处理表格的一个列或一个行
    # DataFrame 处理异构的二维（行列表格）的数据，用来处理excel的一个sheet

# p 为属性

import pandas as pd
import numpy as np

# ===================书写内容=====================
# 没有内容就用nan来表示，解决方法：转换位同一类型
s = pd.Series([1,3,5,np.nan,9,'a'])
print(s)

datas = pd.date_range('20240704',periods=7)
print(datas)

de1 = pd.DataFrame(np.random.randn(7,5),index=datas,columns=list('ABCDE'))
print(de1)

# 用字典作为参数生成dataframe， key就是标题， value就是一列的内容
# 每一列的长度或可以广播为相同长度
df2 = pd.DataFrame({
    'A':[1,2,3,4,5],
    'B':['a','b','c','d','E'],
    'C':1,
    'D':pd.Timestamp('20240724'),
    'E':pd.Series(np.arange(5)),
    'F':np.arange(1,6),
    'G':'aaa',
    'H':pd.Categorical(['男','女','男','女','女'])
})
print(df2)

# ===================查看内容==============================
# 返回后三行的数据
print(de1.tail(3))
# 返回前三行的数据
print(de1.head(3))
# 所有的索引
print(de1.index)
# 所有的标题
print(de1.columns)
# 返回每一列的数量。平均值。最大。最小。标准差
print(de1.describe())
# axis = 0,按行排序；axis=1，按列排序
print(de1.sort_index(axis=0,ascending=True))
# 按照指定列的值进行排序
print(de1.sort_values(by='A'))
# dataframe 对象转numpy数据，只会转内容部分，索引不会转
a = de1.to_numpy()
print(a)

# ===========获取数据===================================
# 返回指定列的数据，参数是列名（标题名）
print(de1['A'])
print(de1.A)
# 返回指定行的内容
print(de1[0:3])
# 按索引，返回指定行的内容
print(de1['20240706':'20240708'])
# 用行的索引返回一列数据，返回类型为Series
print(de1.loc['20240708'])
# 返回指定行列的单元格内容
print(de1.loc['20240708','A'])
# 切片访问，不能用序号，用索引
print(de1.loc['20240706':'20240709','B':'D'])
print(de1.loc['20240706':'20240709',['B','D']])

# ==========按位置获取数据============================
# 返回行号为3的一行数据
print(de1.iloc[3])
# 返回0到2行，1到3列的内容
print(de1.iloc[0:2,1:3])
print(de1.iloc[...,1:3])
print(de1.iloc[0:2,...])
print(de1.iloc[1,1])
de1.iloc[1,1] = 999
print(de1)

# 增加一行数据
de1.loc[pd.Timestamp('20240711')] = [0,1,2,5,9,]
print(de1)
# 增加一列内容，一列向下可广播
de1['F'] = 1
print(de1)

# ==================按条件选择========================
# 返回A列大于零的所有行
print(de1[de1.A > 0])
# 返回表格的完整的形状，大于零的原样返回数据，不大于的返回NaN
print(de1[de1 > 0])

# ==============赋值=======================
# 整列赋值 第一次赋值需要说明索引（赋值一个Series对象，Series要指定index）
de1['A'] = pd.Series(np.arange(8),index=de1.index)
print(de1)
# 单元格赋值
de1.loc['20240708','C'] = 777
print(de1)
de1.iloc[0,0] = 555
print(de1)
# 给切片出的二维数组，进行数组赋值
de1.iloc[2:3,2:4] = np.array([444,333]).reshape(1,2)
# 对小于零的进行取绝对值（根据条件赋值）
de1[de1<0]=np.abs(de1)
print(de1)


# ==================删除======================
# 删除指定的列
del de1['F']
# 返回删除指定列后的数组，不改变原数组
# print(de1.drop('F',axis=1))
# 返回删除指定行后的数组，不改变原数组
# print(de1.drop('20240706',axis=0))
print(de1)


# =============文件操作============================
# 把DataFrame保存为excel文件
# 如果环境没有安装openpyxl的库，需要安装
de1.to_excel('demo.xlsx',sheet_name='测试页')

# ModuleNotFoundError 模块没找到，没有openpyxl这个库